home *** CD-ROM | disk | FTP | other *** search
- int
- do_getsockname(optype, stab, arglast)
- int optype;
- STAB *stab;
- int *arglast;
- {
- register STR **st = stack->ary_array;
- register int sp = arglast[1];
- register STIO *stio;
- int fd;
-
- if (!stab)
- goto nuts;
-
- stio = stab_io(stab);
- if (!stio || !stio->ifp)
- goto nuts;
-
- st[sp] = str_2mortal(Str_new(22,257));
- st[sp]->str_cur = 256;
- st[sp]->str_pok = 1;
- fd = fileno(stio->ifp);
- switch (optype) {
- case O_GETSOCKNAME:
- if (getsockname(fd, st[sp]->str_ptr, (int*)&st[sp]->str_cur) < 0)
- goto nuts2;
- break;
- case O_GETPEERNAME:
- if (getpeername(fd, st[sp]->str_ptr, (int*)&st[sp]->str_cur) < 0)
- goto nuts2;
- break;
- }
-
- return sp;
-
- nuts:
- if (dowarn)
- warn("get{sock,peer}name() on closed fd");
- errno = EBADF;
- nuts2:
- st[sp] = &str_undef;
- return sp;
-
- }
-
-